﻿using DataServiceDTO.Enum;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Text;

namespace IDataService
{
    public interface IDatabaseProvider
    {
        IDbConnection DbConnection { get; }
        IDbTransaction Transaction { get; }

        /// <summary>
        /// 返回指定隔离级别的事务
        ///Read Uncommitted: 允许读取脏数据，一个事务能看到另一个事务还没有提交的数据。（不会阻止其它操作）
        // Read Committed: 确保事务读取的数据都必须是已经提交的数据。它限制了读取中间的，没有提交的，脏的数据。
        // 但是它不能确保当事务重新去读取的时候，读的数据跟上次读的数据是一样的，也就是说当事务第一次读取完数据后，
        // 该数据是可能被其他事务修改的，当它再去读取的时候，数据可能是不一样的。（数据隐藏，不阻止）
        //Repeatable Read: 是一个更高级别的隔离级别，如果事务再去读取同样的数据，先前的数据是没有被修改过的。（阻止其它修改）
        // Serializable: 它做出了最有力的保证，除了每次读取的数据是一样的，它还确保每次读取没有新的数据。（阻止其它添删改）
        // </summary>
        // <param name="isolationLevel">隔离级别</param>
        // <returns></returns>
        IDbTransaction Tran(IsolationLevel isolationLevel);
        /// <summary>
        /// 提交数据，释放事务，不关闭连接
        /// </summary>
        void Commit();
        /// <summary>
        /// 提交数据，释放事务，释放连接
        /// </summary>
        void Save();
        /// <summary>
        /// 回滚事务
        /// </summary>
        void Rollback();

        /// <summary>
        /// 释放事务，关闭连接
        /// </summary>
        void Close();

        /// <summary>
        /// 释放连接、释放事务
        /// </summary>
        void Dispose();

        #region 数据库连接相关
        /// <summary>数据库类型</summary>
        DatabaseType DBType { get; }

        /// <summary>数据库提供者工厂</summary>
        DbProviderFactory ProviderFactory { get; }
        /// <summary>数据库名</summary>
        String ConnName { get; set; }

        /// <summary>链接字符串</summary>
        String ConnectionString { get; set; }

        /// <summary>数据库名</summary>
        String DatabaseName { get; set; }
        #endregion

    }
}
